package com.tool.cn.use;

/**
 * 
 * @author wangzonghui
 * @date 2021-06-03 15:04:27
 * @Description 优雅停止超时线程任务，在原有线程外部增加新线程，监控线程是否执行完毕。
 */
public class ThreadServer {

	    /**
	     * 执行传入线程的线程
	     */
	    private Thread executeThread;

	    /**
	     * 任务是否执行成功标识
	     */
	    private boolean finished = false;

	    /**
	     * 执行传入线程
	     *
	     * @param task 传入执行线程
	     */
	    public void execute(Runnable task) {
	        executeThread = new Thread(() -> {
	        	System.out.println("启动主线程");
	            Thread innerThread = new Thread(task);
	            //设置为守护线程，当外层的线程执行完，它就会结束
	            innerThread.setDaemon(true);
	            innerThread.start();
	            try {
	                //当里面的线程执行完毕后才会执行外层的线程
	                innerThread.join();
	                finished = true;
	                System.out.println("加载完毕");
	            } catch (InterruptedException e) {
	                System.out.println("超时，executeThread被打断");
	            }finally {
	            	System.out.println("异常处理");
	            }
	        });
	        executeThread.start();
	    }

	    /**
	     * 打断执行线程
	     *
	     * @param mills 超时时间
	     */
	    public void shutdown(long mills) {
	        long currentTime = System.currentTimeMillis();
	        while (!finished) {
	            //如果传入线程没有执行完
	            if ((System.currentTimeMillis() - currentTime) >= mills) {
	                System.out.println("Server超时，结束任务！");
	                //如果线程执行时间超过了执行时间，则打断当前线程，传入线程自然就会停止
	                executeThread.interrupt();
	                break;
	            }
	            try {
	                //如果时间没有超时，让当前线程先等一下
	                Thread.sleep(1);
	            } catch (InterruptedException e) {
	                //当前线程的调用者结束，自己也会结束
	                System.out.println("执行线程被打断");
	                break;
	            }
	        }
	        finished = false;
	    }
	}
